RDS Proxyを使ったRDSのクロスアカウントアクセスを試してみる
RDSのクロスアカウントアクセスを "VPC間の接続無しに" 実現したいです。
実現したい背景としては、以下を想定しています。
- AWSのマルチアカウント管理を始めている
- 「新規ワークロードアカウント(APPアカウント)」から「別アカウント(DBアカウント)のデータベース」へアクセスしたい
- ただしセキュリティやネットワーク的制約でVPC Peering, Transit Gateway等の接続が難しい
実現のために、本ブログでは RDS Proxy を使ったアクセスを試してみます。
構成図は以下のとおり。 AWS Organizations 環境下が前提です 。
なお、本検証は以下 AWS公式ブログを大いに参考にしています。
また、別の手段である「PrivateLink + NLB を使った接続」についても以前に試しています。 以下ブログにまとめているので、併せてご覧ください。
作ってみる
以下のようなステップで作成します。
- [前提] RDS等の準備, Resource Access Manager(RAM) の Organizations 連携有効化
- RAMで APPサブネットを共有
- RDS Proxy を作成
- RDS Proxy の追加エンドポイントを作成
1. [前提] RDS 等の準備, RAMのOrganizations 連携有効化
前提として以下環境(VPC, Subnet, RDS など)は作成済みとします。
本ブログでは RDS for MySQL のDBインスタンスをターゲットとします。
また、次のステップで Resource Access Manager(RAM)を使用するので、 それの事前準備も済ませておきます。
管理アカウントの [AWS Organizations > サービス > RAM] にて 「信頼されたアクセスが有効」になっている状態にします。 無効になっている場合は、有効化してください。
2. サブネットを共有
RAMを使って APPサブネットを DBアカウントへ共有します。
このステップは「APPアカウント」での操作です。
[RAM > 自分が共有: リソース共有] にて [リソース共有を作成] を選択します。
リソース共有の名前は適当に記載します。
リソースは [サブネット] を選んで、 共有したいサブネット(= RDS Proxy エンドポイントを配置したいサブネット) を選択します。
ec2:Subnet のマネージド型アクセス許可
部分は選択できないので、 そのまま [次へ] を選択します。
アクセス権限付与先のプリンシパルとして「DBアカウント」を追加します。
作成内容を確認して、 [リソース共有を作成] を選択します。
作成後、サブネットのリソース共有ステータスが 関連付け済み
となればOKです。
以下のようにDBアカウント上でも共有されたサブネットを確認できます。
3. RDS Proxy を作成
DBアカウントにて RDS Proxy を作成します。 作成はマネジメントコンソールで実施しました。
※言及していないパラメータはデフォルトのものです。
[RDS > プロキシ] にて [プロキシの作成] を選択します。
エンジンファミリーはターゲットのものに合わせます。 (今回は MariaDB and MySQL
) プロキシ識別子は適当に記載します。
次にターゲットグループの設定。 データベースをプルダウンから選択します。
認証に使うIAMロールはプロキシ作成時に生成するようにします。 「Secrets Manager のシークレット」にはデータベースへのログインに使う認証情報を渡します。無い場合は新しいシークレットを作成しましょう。
今回は検証なので TLS設定は外します。 「サブネット」には RDS Proxy に関連付けるサブネットを選択します。 「セキュリティグループ」には RDS Proxy に関連付けるセキュリティグループを選択します。
- ※1: ここのサブネット設定では「DBと同じVPCにあるサブネット」しか選択できないので、 適当にVPC内のサブネットを選択しておきます。
- ※2: セキュリティグループ設定は、後述の補足でまとめて説明します。
今回は拡張ログは外します。
上記設定で [プロキシの作成] を選択、RDS Proxy を作成します。
4. RDS Proxy の追加エンドポイントを作成
先程のステップで RDS Proxy が作成されました。 その RDS Proxy に対して 「 追加のエンドポイント 」を作成することで 他のVPCへの接続も可能になります。
作成した RDS Proxy に対して [プロキシエンドポイントを作成] していきます。
プロキシエンドポイント名は適当に記入します。
接続設定にて RAMで共有されたサブネット を選択します。
作成後、以下のようにエンドポイントが2種類あることを確認します。
追加で作成したエンドポイントのアドレスを利用します。
補足. セキュリティグループ設定
必要なセキュリティグループ(SG)、およびその設定(インバウンドルール)は以下のとおりです。
- クライアントSG : RDS (RDS Proxy) へ接続したいクライアント(EC2等)
- RDS Proxy 追加エンドポイントSG : RDS Proxy の追加のエンドポイント
クライアントSGからのDBポート許可
を付与する
- RDS Proxy SG : RDS Proxy
- RDS SG : RDS
RDS Proxy SGからの DBポート許可
を付与する
接続テスト
APPアカウント上にEC2インスタンスを建てて、接続します。
接続には「RDS Proxy 追加のエンドポイント」のアドレスが必要です。事前にメモしておきます。
以下のように、DBアカウントのMySQLへ接続できることを確認できました。
db_user="example" db_password="********" db_endpoint="proxy-db-test-for-app.endpoint.proxy-example.ap-northeast-1.rds.amazonaws.com" mysql --host=${db_endpoint} --user=${db_user} --password=${db_password} # mysql: [Warning] Using a password on the command line interface can be insecure. # Welcome to the MySQL monitor. Commands end with ; or \g. # Your MySQL connection id is 119 # Server version: 8.0.32 Source distribution # # Copyright (c) 2000, 2023, Oracle and/or its affiliates. # # Oracle is a registered trademark of Oracle Corporation and/or its # affiliates. Other names may be trademarks of their respective # owners. # # Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. # # mysql>
考慮点
対応しているエンジンについて
以下公式ドキュメントを確認して、 そもそも RDS Proxy のターゲットにできるかを調査する必要があります。
また 現状(2023/05/25)では、 読み取り専用のエンドポイント(リーダーエンドポイント) は Aurora クラスターのみ対象です。
コストについて
RDS Proxy 自体の料金は以下ページで確認できます。 基となる インスタンスの vCPU に応じた課金体型となっています。
また、「追加のエンドポイント」を作成すると、その分の AWS PrivateLink の料金 が掛かります。併せて確認しておきましょう。
※デフォルトのエンドポイント(RDS Proxy作成時に配置されるエンドポイント)の追加料金はありません
おわりに
RDS Proxy を使ったRDSクロスアカウントアクセスを試してみました。
以前上げた PrivateLink + NLB 版 と比べて、 よりAWSマネージドにクロスアカウントアクセスを実現できて良いと感じました。 もちろん「コスト(vCPU単位)」や「そもそもターゲットにできるか」あたりの考慮点はあるので、 事前に確認・見積もりは必要そうです。
以上、参考になれば幸いです。